import 'package:flutter/services.dart';

import 'entity/flow_tts_entity.dart';
import 'entity/init_entity.dart';
import 'plugin_asr_platform_interface.dart';

enum AsrEvent {
  // 语音识别过程事件
  asrListenerProcess,
  // 语音识别完成事件
  asrListenerSuccess
}

class PluginAsr {
  static final PluginAsr _instance = PluginAsr._internal();

  PluginAsr._internal();

  factory PluginAsr() {
    return _instance;
  }

  bool _isInitialized = false;

  /// 初始化方法，必须在使用其他功能前调用
  Future<int?> init(String appId, String apiKey, String apiSecret) async {
    if (_isInitialized) {
      return 0; // 或者你可以返回一个特定的状态码表示已初始化
    }

    InitEntity initEntity = InitEntity(
      appId: appId,
      apiKey: apiKey,
      apiSecret: apiSecret,
    );

    final result = await PluginAsrPlatform.instance.init(initEntity);
    if (result != null && result >= 0) {
      _isInitialized = true;
      _setupNativeMessageListener();
    }
    return result;
  }

  /// 所有观察者
  final List<AsrObserver> _observer = [];

  /// 注册观察者
  void attach(AsrObserver observer) {
    _observer.add(observer);
  }

  /// 移除观察者
  void detach(AsrObserver observer) {
    _observer.remove(observer);
  }

  /// 通知所有观察者
  void _notifyObserver(MethodCall call) {
    for (var observer in _observer) {
      observer.onAsrData(call);
    }
  }

  /// 设置原生消息监听器
  Future<void> _setupNativeMessageListener() {
    _ensureInitialized();
    return PluginAsrPlatform.instance.setupNativeMessageListener((call) {
      _notifyObserver(call);
    });
  }

  /// 开始语音识别监听
  /// language ： zh_cn:中文，en_us:英文。其他语种参见集成文档
  Future<String?> startAsrListener(String language) {
    _ensureInitialized();
    return PluginAsrPlatform.instance.startAsrListener(language);
  }

  /// 停止语音识别监听
  Future<int?> stopAsrListener() {
    _ensureInitialized();
    return PluginAsrPlatform.instance.stopAsrListener();
  }

  /// 开始在线 TTS
  Future<int?> startOnlineTTS(String text) {
    _ensureInitialized();
    return PluginAsrPlatform.instance.startOnlineTTS(text);
  }

  /// 停止在线 TTS
  Future<int?> stopOnlineTTS() {
    _ensureInitialized();
    return PluginAsrPlatform.instance.stopOnlineTTS();
  }

  /// 开始真人 TTS
  Future<int?> startPersonTTS(String text) {
    _ensureInitialized();
    return PluginAsrPlatform.instance.startPersonTTS(text);
  }

  /// 开始流式真人 TTS
  Future<int?> startFlowPersonTTS(FlowTtsEntity flowTtsEntity) {
    _ensureInitialized();
    return PluginAsrPlatform.instance.startFlowPersonTTS(flowTtsEntity);
  }

  /// 停止真人 TTS
  Future<int?> stopPersonTTS() {
    _ensureInitialized();
    return PluginAsrPlatform.instance.stopPersonTTS();
  }

  /// 获取平台版本
  Future<String?> getPlatformVersion() {
    _ensureInitialized();
    return PluginAsrPlatform.instance.getPlatformVersion();
  }

  /// 内部方法：确保已经初始化，否则抛出异常
  void _ensureInitialized() {
    if (!_isInitialized) {
      throw Exception('PluginAsr 未初始化，请先调用 init() 方法进行初始化');
    }
  }
}

abstract class AsrObserver {
  void onAsrData(MethodCall call);
}